const Koa = require('koa')
const KoaRouter = require('koa-router')
const app = new Koa();
const router = new KoaRouter();
const {
  list
} = require('./mock')
const bodyParser = require('koa-bodyparser');
const payConfig = require('./config/pay')
const AlipaySdk = require('alipay-sdk').default;
// TypeScript，可以使用 import AlipaySdk from 'alipay-sdk';
// 普通公钥模式
const alipaySdk = new AlipaySdk({
  appId: payConfig.appId,
  // keyType: 'PKCS1', // 默认值。请与生成的密钥格式保持一致，参考平台配置一节
  privateKey: payConfig.privateKey,
  alipayPublicKey: payConfig.alipayPublicKey,
  gateway: payConfig.gateway
});

// 必须启动中间件， 获取json
app.use(bodyParser());

// 列表请求
router.get('/api/list', ctx => {
  ctx.body = {
    code: 200,
    data: list,
    message: 'ok'
  }
})


// 支付接口
router.post('/api/pay/zhifubao', async (ctx) => {
  // 1. 获取标题，总价， 单号
  const {
    title,
    price,
    id
  } = ctx.request.body;
  try {
    // 2. 支付
    const resp = await alipaySdk.pageExec('alipay.trade.wap.pay', {
      method: 'get',
      return_url: 'http://localhost:3000/pay/result',
      biz_content: {
        out_trade_no: id,
        total_amount: price,
        subject: title
      }
    })

    ctx.body = {
      code: 200,
      data: resp,
      message: '下单成功'
    }
  } catch (error) {
    console.log(error)
    ctx.body = {
      code: 400,
      error: error,
      message: '下单失败'
    }
  }
})

// 支付结果接口
router.get('/api/pay/result', async ctx => {
  const {
    out_trade_no,
    trade_no
  } = ctx.request.query

  // 2. 查询 
  const resp = await alipaySdk.exec('alipay.trade.query', {
    biz_content: {
      out_trade_no,
      trade_no
    }
  })
  // 判断
  const {
    code,
    tradeStatus
  } = resp;
  if (code === "10000") {
    let message = ''
    // 3. 返回结果
    switch (tradeStatus) {
      case 'WAIT_BUYER_PAY':
        message = '交易创建，等待买家付款';
        break;
      case 'TRADE_CLOSED':
        message = '未付款交易超时关闭，或支付完成后全额退款';
        break;
      case 'TRADE_SUCCESS':
        message = '交易支付成功';
        break;
      case 'TRADE_FINISHED':
        message = '交易结束，不可退款';
        break;
    }
    ctx.body = {
      code: 200,
      data: resp,
      message: message
    }
  } else {
    ctx.body = {
      code: 404,
      message: '交易不存在'
    }
  }

})


app.use(router.routes()).use(router.allowedMethods())



app.listen(7002, () => console.log('7002 is running'))